先解決眼前的難題,然後等待,讓時間替你解決! -- 《舉重妖精金福珠》
上一篇我們會發現,當我們要建立實體(Entity)時,必須將屬性增加 getter & setter 方法,而程式碼會導致存在許多 getterr 與 setter,此時我們就可以使用 Java Library- Lombok,它的誕生主要是希望幫助我們大幅減少 Java 實務開發上會有許多 getter 與 setter 的問題,讓我們不用再一直寫getter、setter,只要在類別上使用 @Getter @Setter Annotation 標註即可。
(1)在pom.xml添加dependency Lombok官方文件
<dependencies>
	<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
		<version>1.18.12</version>
		<scope>provided</scope>
	</dependency>
</dependencies>
(2)還要要安裝 Intellij lombok 插件,是因為如果不安裝 lombok plugin的話,Intellij 就會沒辦法自動提示出 lombok 產生的方法,所以就會發生 code 一片紅。->Lombok plugin
原本寫法
import javax.persistence.*;
@Entity
@Table
public class Todo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Integer id;
    @Column
    String task;
    @Column
    Integer status;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getTask() {
        return task;
    }
    public void setTask(String task) {
        this.task = task;
    }
    public Integer getStatus() {
        return status;
    }
    public void setStatus(Integer status) {
        this.status = status;
    }
}
可以聲明@Getter @Setter 為此類的屬性自動產生Get/ Set方法
package com.caili.todolist.entity;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.*;
@Entity
@Table
@Getter @Setter
@NoArgsConstructor
public class Todo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Integer id;
    @Column
    String task;
    @Column
    Integer status;
}
原本寫法
import javax.persistence.*;
   /**
    * @author cai-li
    */
   @Entity
   @Table
   public class Todo {
       @Id
       @GeneratedValue(strategy = GenerationType.IDENTITY)
       Integer id;
       @Column
       String task;
       @Column
       Integer status;
       @Override
       public String toString() {
           return "Todo{" +
                   "id=" + id +
                   ", task='" + task + '\'' +
                   ", status=" + status +
                   '}';
       }
 }
使用@ToString後
@Entity
@Table
@ToString
public class Todo {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   Integer id;
   @Column
   String task;
   @Column
   Integer status;
   
}
JPA為Java Persistence API的簡寫,它是官方提出的ORM規範,也是一個 Java 應用程式的介面,利用標註 Annotation 的方式或XML描述物件與關係表的對應關係,import 套件時的package路徑為 javax.persistence.*,常見如:@Entity、@Table、@Column、@Transient等標註 Annotation。
但JPA只是一個介面,需要實現它,而 Hibernate就是實現了JPA介面的ORM框架。
為 Spring 基於ORM框架、JPA規範封裝的一套JPA應用框架,底層使用了Hibernate,可以使開發者用簡單的程式碼實現對資料庫溝通與操作,包含了新增、修改、刪除等易於我們進行其他方法擴充,我們這次是Spring Data JPA 來簡化JPA的實現並對資料庫進行溝通與操作。
資料存取物件(Data Access Object, DAO)是為了讓我們在開發專案時,處理資料庫相關操作更方便而產生的物件,它會幫助我們封裝資料庫進行持久層的操作,我們會在 DAO 層提供一些特定的資料操作,不需要直接暴露資料庫細節。
方法命名規則進行相關資料庫操作,簡化程式碼。

(1)在src → main → java → com.xxx..xxx → dao 建立一個名為TodoDao.java 的interface,並且繼承CrudRepository,CrudRepository文件,裡面有提供操作資料庫的方法。
|-- src
    |-- main
        |-- java
             |-- com.xxx.xxxxx
                  |-- entity
                    |-- Todo.java
                  |-- dao
                    |-- TodoDao.java
                  |-- TodoListApplication.java # 程式進入點

(2) TodoDao.java 創造TodoDao就可以用DAO 去操作資料庫了。
import com.caili.todolist.entity.Todo;
import org.springframework.data.repository.CrudRepository;
// 第一個參數為訪問的實體,第二參數是這個Entity ID的資料型態
public interface TodoDao extends CrudRepository<Todo, Integer> {
}
我在實作DAO時候有遇到一個問題,用TodoDao 去繼承一個CrudRepository的介面,卻不用implement它的方法,就可以直接使用TodoDao 去操作資料庫物件,如下。
@Service
public class TodoService {
    @Autowired
    TodoDao todoDao;
    public Iterable<Todo> getTodo() {
        return todoDao.findAll();
    }
}
而stackoverflow也有人相同疑問(https://stackoverflow.com/questions/58881221/why-do-we-extend-jparepository-interface-and-not-implements-it )
是因為TodoDao將在運行時基於SimpleJpaRepository從Spring Data JPA實現,從內部文件來看,CrudRepository 已經有繼承一個SimpleJpaRepository 的class,而這個class已經有實作一些方法了,可以至SimpleJpaRepository 看更詳細的文件。